package com.example.configuration;

import com.example.handler.NoAuthorityHandler;
import com.example.securityservice.LogAccountPasswordCheckService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;

import javax.activation.DataSource;

/** 所有的url请求控制处理
 * @author LiuShanshan
 * @version V1.0
 * @Description
 */
@Configuration
public class SecurityUrlControlConfig extends WebSecurityConfigurerAdapter{
    @Autowired
    private PersistentTokenRepository persistentTokenRepository;

    @Autowired
    private LogAccountPasswordCheckService logAccountPasswordCheckService;

    @Autowired
    private NoAuthorityHandler noAuthorityHandler;

    // 外面请求的时候，都需要权限验证，到里面，成功之后可以请求接口，如果返回跳转地址给前面，需要将此地址加入到权限中

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 验证（登录）
        http.formLogin()
                // 自定义页面
                .loginPage("/login.html")
                // loging.html上的action里面的参数，去执行securityService
                .loginProcessingUrl("/login")
                // 登录成功后跳转页面，POST请求 todo 自定义处理器之后，不能使用默认处理器
                .successForwardUrl("/showLogin")
//                .successHandler(new MyAuthenticationSuccessHandler("https://www.baidu.com/"))
                // 登录失败后跳转页面，POST请求
                .failureForwardUrl("/toError")
                // 自定义失败处理器
//                .failureHandler(new ErrorHandler("https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_0f948d4b12b04b69ba6b6f143b3f37b3"))
                // 设置用户名参数名
                .usernameParameter("myusername")
                .passwordParameter("mypassword");


//         remember me
        http.rememberMe()
                // 持久层对象
                .tokenRepository(persistentTokenRepository)
                // 过期时间；默认2周
                .tokenValiditySeconds(20)
                //登录逻辑交给哪个对象
                .userDetailsService(logAccountPasswordCheckService);

        // 权限
        http.authorizeRequests()
                // login.html 不需要被验证
                .antMatchers("/showLogin").permitAll()
                .antMatchers("/login.html").permitAll()
//                .antMatchers(HttpMethod.GET,"/xxxx/login.html").permitAll()
                // mvcMatchers验证，后面加上servletPath会自动加上前缀，一般不适用，适用antMatchers即可
//                .mvcMatchers("/login.html").servletPath("/xxxx").permitAll()
                // error.html不需要验证
                .antMatchers("/error.html").permitAll()
                // 权限控制，给方法赋请求权限；只有当用户有权限的时候，才能进入
//                .antMatchers("/main.html").access("hasRole('abc234')")
//                .antMatchers("/security.html").hasAuthority("Hasf");
                // 底层都是使用access
//                .antMatchers("/security.html").access("hasAuthority('accessAuthorityte')")
//                .antMatchers("/security.html").hasAnyAuthority("Hasf", "admin")
                // 只有此角色才能进入此方法
//                .antMatchers("/security.html").hasRole("SDFAS")
//                .antMatchers("/security.html").hasIpAddress("127.0.0.1")
                // 所有请求都需要被验证,必须登录后被访问
//                .anyRequest().authenticated();
                // 自定义请求验证
//                .anyRequest().access("@myServiceImpl.hasPermission(request, authentication)");
                .anyRequest().authenticated();   // 所有请求被拦截
        // 异常处理
        http.exceptionHandling()
                // 出现异常之后，交给MyAccessDeniedHandler类处理
                .accessDeniedHandler(noAuthorityHandler);

        http.logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login.html");
        // 关闭csrf防护
//        http.csrf().disable();
    }

}
